/**
 * 环形队列的 I/O 接口
 * 张勇 41204@qq.com
 */

#pragma once

#include <stdint.h>
#include <stdbool.h>
#include "std_err.h"
#include "unios.h"


#ifdef __cplusplus
extern "C" {
#endif

/**
 * 从 ring 头部读取指定长度数据
 * @param ringbuf 环缓冲区指针
 * @param ring_base 环基地址(相对于 ringbuf 的偏移)
 * @param ring_size 环大小(字节)
 * @param ring_head 环形队列当前头部位置(相对于 ring_base 的偏移)
 * @param dst 保存读取数据的缓冲区
 * @param size 要读取的数据长度(字节)
 * @param ring_align 环形队列读写时要求的对齐长度(字节), 可取 1,4,8
 * @return 标准错误码。=0 时表示正确。
 */
std_err_t ringbuf_read(void *ringbuf, size_t ring_base, size_t ring_size, size_t ring_head, void *dst, size_t size, size_t ring_align);

/**
 * 向 ring 尾部写入指定长度数据
 * @param ringbuf 环缓冲区指针
 * @param ring_base 环基地址(相对于 ringbuf 的偏移)
 * @param ring_size 环大小(字节)
 * @param ring_tail 环形队列当前尾部位置(相对于 ring_base 的偏移)
 * @param src 要写入的数据缓冲区
 * @param size 要写入的数据长度(字节)
 * @param align_size 环形队列读写时要求的对齐长度(字节), 可取 1,4,8
 * @return 标准错误码。=0 时表示正确。
 */
std_err_t ringbuf_write(void *ringbuf, size_t ring_base, size_t ring_size, size_t ring_tail, const void* src, size_t size, size_t ring_align);

/**
 * 从文件中的 ring 头部读取指定长度数据
 * @param uf 文件句柄
 * @param ring_base 环基地址(相对于文件头部的偏移)
 * @param ring_size 环大小(字节)
 * @param head 环形队列当前头部位置(相对于 ring_base 的偏移)
 * @param dst 保存读取数据的缓冲区
 * @param size 要读取的数据长度(字节)
 * @return 标准错误码。=0 时表示正确。
 */
std_err_t ringfile_read(unios_file_t uf, size_t ring_base, size_t ring_size, size_t head, void *dst, size_t size);

/**
 * 向文件中的 ring 尾部写入指定长度数据
 * @param uf 文件句柄
 * @param ring_base 环基地址(相对于文件头部的偏移)
 * @param ring_size 环大小(字节)
 * @param tail 环形队列当前尾部位置(相对于 ring_base 的偏移)
 * @param src 要写入的数据缓冲区
 * @param size 要写入的数据长度(字节)
 * @return 标准错误码。=0 时表示正确。
 */
std_err_t ringfile_write(unios_file_t uf, size_t ring_base, size_t ring_size, size_t tail, const void* src, size_t size);

#ifdef __cplusplus
}
#endif
